package com.wtwd.campus.vcom.dao;

import com.wtwd.campus.vcom.entity.VcomRequestRecord;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.Mapper;

import java.util.List;
import java.util.Map;

/**
 * @Author: ldaoliang
 * @DateTime: 2022/1/6 11:03
 * @Description:
 */
@Mapper
public interface RequestRecordMapper {

    /**
     * 保存请求记录
     *
     * @param requestId
     * @param commandNumber
     * @param imei
     * @param data
     * @param type
     * @param createTime
     * @return
     */
    int saveRequestRecord(@Param("requestId") String requestId, @Param("commandNumber") String commandNumber,
                          @Param("imei") String imei, @Param("data") String data, @Param("type") int type,
                          @Param("createTime") Long createTime);

    /**
     * 获取最后一条发送中的指令
     *
     * @param imei
     * @param type
     * @return
     */
    VcomRequestRecord getOldestSendingCommand(@Param("imei") String imei, @Param("type") int type);

    /**
     * 获取最后一条未发送的指令
     *
     * @param imei
     * @param type
     * @return
     */
    VcomRequestRecord getOldestNotSendCommand(@Param("imei") String imei, @Param("type") int type);

    /**
     * 更新指令发送状态
     *
     * @param id
     * @param status
     * @return
     */
    int updateCommandSendStatus(@Param("id") Integer id, @Param("status") int status);


    /**
     * 批量保存
     *
     * @param vcomRequestRecordList
     * @return
     */
    int batchSaveRequestRecord(@Param("list") List<VcomRequestRecord> vcomRequestRecordList);

    /**
     * 查询requestId
     *
     * @param imei
     * @param commandNumber
     * @param type
     * @return
     */
    Map<String, Object> selectRequestId(@Param("imei") String imei, @Param("commandNumber") String commandNumber, @Param("type") int type);

    /**
     * 更新推送状态
     *
     * @param id
     * @param status
     * @param time
     * @return
     */
    int updatePushStatus(@Param("id") int id, @Param("status") int status, @Param("completeTime") Long time);


    /**
     * 根据imei、流水号、类型查找一条请求记录
     *
     * @param imei
     * @param commandNumber
     * @param type
     * @return
     */
    VcomRequestRecord getRequestRecord(@Param("imei") String imei, @Param("commandNumber") String commandNumber, @Param("type") Integer type);

    /**
     * 修改请求记录信息
     *
     * @param data
     * @return
     */
    int modifyRequestRecord(@Param("data") VcomRequestRecord data);

    /**
     * 修改推送状态
     *
     * @param id
     * @param status
     * @param time
     * @return
     */
    int modifyPushStatus(@Param("id") Integer id, @Param("status") Integer status, @Param("time") Long time);

    Integer updateVcomRequestStateById(@Param("id") int id, @Param("state") Integer state);

    /**
     * 获取vcom的历史记录
     * 防止重复序列号
     * 倒序排列取最后一条
     *
     * @param imei
     * @param commandNumber
     * @param type
     * @return
     */
    VcomRequestRecord getRequestRecordByDescOne(@Param("imei") String imei, @Param("commandNumber") String commandNumber, @Param("type") int type);

    /**
     * 根据条件更新请求最后的状态
     *
     * @param imei
     * @param types
     * @param states
     * @param state
     * @return
     */
    Integer updateVcomRequestStateByTypesAndImei(@Param("imei") String imei, @Param("types") List<Integer> types, @Param("states") List<Integer> states, @Param("state") int state);

    /**
     * 完成vocm记录所有指令
     *
     * @param imei
     * @return
     */
    int CompleteAllInstructions(@Param("imei") String imei, @Param("status") Integer status);

    /**
     * 根据类型完成指令
     *
     * @param imei
     * @param type
     * @param status(修改后的状态)
     * @param list           该状态为 发送 或发送中的状态 这里为条件
     * @return
     */
    int CompleteInstructionsByType(@Param("imei") String imei, @Param("type") int type, @Param("status") int status, @Param("list") List<Integer> list);

    /**
     * 添加指令记录，且为执行状态
     *
     * @param requestId
     * @param commandNumber
     * @param imei
     * @param data
     * @param type
     * @param createTime
     * @param status
     * @return
     */
    int sendCommanding(@Param("requestId") String requestId, @Param("commandNumber") String commandNumber, @Param("imei") String imei, @Param("data") String data, @Param("type") Integer type, @Param("createTime") long createTime, @Param("status") int status);
}
